home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
gfx
/
misc
/
VividCompare.lha
/
AmigaMandel.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-23
|
12KB
|
412 lines
/*
* Mandel2.c - Vivid 24 to Amiga speed comparison
*
*/
#define CONFIG_VAL 0xefa00434
#define MODE 6 /* 800 x 600 */
#define HRES 800
#define VRES 600
#define SRAM_FILE "MANDEL.ABS"
/* Uncomment this line to have the Amiga render to the Vivid rather */
/* than its own screen. */
//#define AMIGA2VIVID
#define FAST
#include <exec/types.h>
#include <exec/memory.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <time.h>
#include <stdio.h>
#include <sage/sage_proto.h>
#include <sage/sage_pragma.h>
#include <sage/tms340/gsptypes.h>
#include <sage/tms340/gspreg.h>
#include <sage/tms340/tms340.h>
#include <sage/vivid/iodata.h>
#include <sage/tms340/colors.h>
// tms340 library
#include <sage/tms340/tms340_proto.h>
#include <sage/tms340/tms340_pragma.h>
// macros
#include <sage/tms340/tms340_defines.h>
#include "/extSRAM/extSRAMpragma.h"
#include "/extSRAM/extSRAMprotos.h"
#include "/extSRAM/extSRAM.h"
struct Library *SAGEBase;
struct Library *TMS340Base;
struct Library *extSRAMBase;
struct iodata *TMS340io;
struct iodata *extio;
SAGEList *sagelist;
SAGEList *sl;
SAGEInfo sageinfo;
CONFIG config;
extern void ReverseBytes(ULONG *, int);
extern void LoadSRAMCode(LONG, ULONG *, LONG);
struct Screen *Screen;
struct Window *Window;
void ComputeFractal(void)
{
UWORD Row, Column;
float DeltaI = 2.0 / (float)VRES;
float DeltaR = 3.0 / (float)HRES;
float AR, AR2, AI, AI2;
float ConstI, ConstR;
#ifdef AMIGA2VIVID
ULONG Color;
ULONG *PixelData;
ULONG *screenAddr = (ULONG *)TMS340io->baddr->mem_base;
clear_frame_buffer(0x00);
PixelData = AllocMem(HRES * sizeof(ULONG), MEMF_ANY);
#else
#ifdef FAST
UBYTE Color;
struct RastPort *rastPort = &Screen->RastPort;
UBYTE *PixelData;
struct RastPort tempRastPort;
struct BitMap tempBitMap;
int plane;
PixelData = AllocMem((HRES * sizeof(UBYTE)) + 15, MEMF_ANY);
// InitRastPort(&tempRastPort);
tempRastPort = *rastPort;
tempRastPort.Layer = NULL;
InitBitMap(&tempBitMap, 8, HRES, VRES);
tempRastPort.BitMap = &tempBitMap;
for(plane = 0; plane < 8; plane++)
{
tempBitMap.Planes[plane] = AllocMem((((HRES + 15) >> 4) << 1), MEMF_CHIP | MEMF_CLEAR);
}
#else
UBYTE Color;
struct RastPort *rastPort = &Screen->RastPort;
#endif
#endif
for(Row = 0; Row < VRES; Row++)
{
ConstI = (DeltaI * (float)Row) - 1;
ConstR = -2;
for(Column = 0; Column < HRES; Column++)
{
AR = AI = AR2 = AI2 = 0;
for(Color = 128; Color > 0; Color--)
{
AI = (AR * AI * 2) + ConstI;
AR = AR2 - AI2 + ConstR;
AR2 = AR * AR;
AI2 = AI * AI;
if((AR2 + AI2) > 4)
break;
}
#ifdef AMIGA2VIVID
PixelData[Column] = Color;
#else
#ifdef FAST
PixelData[Column] = Color;
#else
SetAPen(rastPort, Color);
WritePixel(rastPort, Column, Row);
#endif
#endif
ConstR += DeltaR;
}
#ifdef AMIGA2VIVID
CopyMemQuick((APTR)PixelData, (APTR)(screenAddr + (Row << 10)), HRES << 2);
#endif
#ifdef FAST
WritePixelLine8(&Screen->RastPort, 0, Row, HRES, PixelData, &tempRastPort);
#endif
}
#ifdef AMIGA2VIVID
FreeMem(PixelData, HRES * sizeof(ULONG));
#endif
#ifdef FAST
FreeMem(PixelData, (HRES * sizeof(UBYTE)) + 15);
for(plane = 0; plane < 8; plane++)
{
FreeMem(tempBitMap.Planes[plane], (((HRES + 15) >> 4) << 1));
}
#endif
}
void main(void)
{
long data, prog;
long *dataAddr, *progAddr;
int SAGEAlive = 0;
struct FileInfoBlock fib;
BPTR handle;
unsigned int clock1[2], clock2[2], clock3[2];
unsigned int amigaTime, vividTime;
printf("Vivid 24, Mandelbrot calculation comparison program.\n");
printf("\tCopyright ©1993 - Digital Micronics, Inc.\n\n");
printf("\tThis program is being used to compare rendering speed and\n");
printf("\tprocessing power of the Amiga to the Vivid 24 rendering\n");
printf("\tengine. It is released as freely redistributalbe to show we\n");
printf("\tare not using \"smoke and mirrors\" when we compare the\n");
printf("\tVivid 24 to your Amiga. The Mandelbrot routines are not\n");
printf("\tas highly optimized as some code, but since the Vivid 24\n");
printf("\tis running the identical code (see included source), it is\n");
printf("\ta fair comparison of RELATIVE performance. This code will\n");
printf("\trun with our without a Vivid 24 installed. Without the\n");
printf("\tboard, it will test your Amiga and display the results as\n");
printf("\tcompared to the various configuration of the Vivid 24. With\n");
printf("\ta Vivid 24 card installed, you will be given the times\n");
printf("\tyourself so you can make your own comparison.\n\n");
printf("Attempting to load Vivid 24 environment.\n");
if(SAGEBase = OpenLibrary("sage.library", 0))
{
if(!GetSAGEList(&sagelist, "TMS340"))
{
if(!OpenSAGE(&sageinfo, 0, sagelist->LibName, 1, 0, 0))
{
TMS340Base = sageinfo.LibBase;
TMS340io = sageinfo.iodata;
if(!open_gsp_library(sageinfo.iodata, &extio, "extSRAM", 0, 0))
{
extSRAMBase = get_libbase(extio);
get_config(&config);
if(config.sys_flags & 0x0000000f)
{
if(handle = Open(SRAM_FILE, MODE_OLDFILE))
{
ExamineFH(handle, &fib);
if(prog = gsp_malloc(fib.fib_Size + 8))
{
prog += 64;
if(data = gsp_malloc(256 + 8))
{
data += 64;
progAddr = (ULONG *)(((prog - 0xf0000000) >> 3) +
extio->baddr->mem_base);
dataAddr = (ULONG *)(((data - 0xf0000000) >> 3) +
extio->baddr->mem_base);
if(Read(handle, progAddr, fib.fib_Size) == fib.fib_Size)
{
SAGEAlive = ~0;
ReverseBytes(progAddr, fib.fib_Size);
set_config(MODE, 1);
set_coloring_mode(INDEXCOLOR);
clear_frame_buffer(0x00);
Init082Int(extio, TMS340Base);
*dataAddr = *(dataAddr + 1) = CONFIG_VAL;
if(config.sys_flags & 0x00000001)
{
Abort082(extio, TMS340Base, 0);
Set082Regs(extio, TMS340Base, 0, CR_CONFIG, data, 1);
LoadSRAMCode(0, progAddr, fib.fib_Size >> 2);
}
if(config.sys_flags & 0x00000002)
{
Abort082(extio, TMS340Base, 1);
Set082Regs(extio, TMS340Base, 1, CR_CONFIG, data, 1);
LoadSRAMCode(1, progAddr, fib.fib_Size >> 2);
}
if(config.sys_flags & 0x00000004)
{
Abort082(extio, TMS340Base, 2);
Set082Regs(extio, TMS340Base, 2, CR_CONFIG, data, 1);
LoadSRAMCode(2, progAddr, fib.fib_Size >> 2);
}
if(config.sys_flags & 0x00000008)
{
Abort082(extio, TMS340Base, 3);
Set082Regs(extio, TMS340Base, 3, CR_CONFIG, data, 1);
LoadSRAMCode(3, progAddr, fib.fib_Size >> 2);
}
}
else
{
printf("Error reading SRAM file.\n");
data -= 64;
gsp_free(data);
prog -= 64;
gsp_free(prog);
CloseSAGE(&sageinfo);
FreeSAGEList(sagelist);
CloseLibrary(SAGEBase);
}
}
else
{
printf("Unable to allocate working DRAM.\n");
prog -= 64;
gsp_free(prog);
CloseSAGE(&sageinfo);
FreeSAGEList(sagelist);
CloseLibrary(SAGEBase);
}
}
else
{
printf("Unable to allocate enough DRAM for SRAM code.\n");
CloseSAGE(&sageinfo);
FreeSAGEList(sagelist);
CloseLibrary(SAGEBase);
}
Close(handle);
}
else
{
printf("Unable to open %s.\n", SRAM_FILE);
CloseSAGE(&sageinfo);
FreeSAGEList(sagelist);
CloseLibrary(SAGEBase);
}
}
else
{
printf("No coprocessors found on your Vivid card.\n");
CloseSAGE(&sageinfo);
FreeSAGEList(sagelist);
CloseLibrary(SAGEBase);
}
}
else
{
printf("Unable to open extSRAM.library.\n");
CloseSAGE(&sageinfo);
FreeSAGEList(sagelist);
CloseLibrary(SAGEBase);
}
}
else
{
printf("Unable to load vivid.library and initialize board.\n");
FreeSAGEList(sagelist);
CloseLibrary(SAGEBase);
}
}
else
{
printf("SAGEList not found.\n");
CloseLibrary(SAGEBase);
}
}
else
{
printf("sage.library not found.\n");
}
if(!(Screen = OpenScreenTags(NULL,
SA_Width, 800,
SA_Height, 600,
SA_Depth, 8,
SA_DisplayID, 0x00089024,
TAG_END)))
{
Screen = OpenScreenTags(NULL,
SA_AutoScroll, TRUE,
SA_Width, 800,
SA_Height, 600,
SA_Depth, 4,
SA_DisplayID, 0x00008004,
// SA_Overscan, OSCAN_VIDEO,
TAG_END);
}
if(!Screen)
{
printf("Unable to open 800 x 600 screen.\n");
}
else
{
Window = OpenWindowTags(NULL,
WA_CustomScreen, Screen,
WA_Width, 800,
WA_Height, 600,
WA_Flags, WFLG_BACKDROP | WFLG_BORDERLESS | WFLG_ACTIVATE | WFLG_RMBTRAP,
TAG_END);
}
if(config.sys_flags & 0x0000000f)
{
printf("Testing Vivid 24 at 800 x 600.\n");
timer(clock1);
Mandel(extio, TMS340Base, HRES, VRES);
synchronize();
}
timer(clock2);
if(Screen)
{
printf("Testing Amiga at 800 x 600.\n");
ComputeFractal();
timer(clock3);
}
if(SAGEAlive)
{
if(Screen)
{
vividTime = clock2[0] - clock1[0];
amigaTime = clock3[0] - clock2[0];
printf("TIMES -> Amiga: %d seconds (%02d:%02d), Vivid 24: %d seconds (%02d:%02d).\n",
amigaTime, amigaTime / 60, amigaTime % 60,
vividTime, vividTime / 60, vividTime % 60);
printf("The Vivid was %d times as fast as the Amiga!\n",
amigaTime / vividTime);
}
else
{
vividTime = clock2[0] - clock1[0];
printf("TIME -> Vivid 24: %d seconds (%02d:%02d).\n",
vividTime, vividTime / 60, vividTime % 60);
}
}
else
{
amigaTime = clock3[0] - clock2[0];
printf("TIME -> Amiga: %d seconds (%02d:%02d).\n",
amigaTime, amigaTime / 60, amigaTime % 60);
printf("Compare: Vivid 24 with 1 copro: 15 seconds (00:15) = %d times your Amiga!\n", amigaTime / 15);
printf(" Vivid 24 with 2 copro: 7 seconds (00:07) = %d times your Amiga!\n", amigaTime / 8);
printf(" Vivid 24 with 4 copro: 4 seconds (00:04) = %d times your Amiga!\n", amigaTime / 4);
}
if(Screen)
{
ScreenToBack(Screen);
printf("Press <Enter> to continue.\n");
getch();
if(Window)
CloseWindow(Window);
CloseScreen(Screen);
}
if(SAGEAlive)
{
synchronize();
close_gsp_library(extio);
CloseSAGE(&sageinfo);
FreeSAGEList(sagelist);
CloseLibrary(SAGEBase);
}
}